﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using SistemadeEstágios.Negocio;
using SistemadeEstágios.Model;

namespace SistemadeEstágios
{
    public partial class frmPesquisa : Form
    {
        #region Propriedades
        /// <summary>
        /// Titulo da Janela
        /// </summary>
        public string titulo { get; set; }

        /// <summary>
        /// Tipo de Pesquisa
        /// </summary>
        public TipoPesquisa Tipo { get; set; }

        /// <summary>
        /// Variável que controla a busca
        /// </summary>
        public bool bRetorno { get; set; }

        /// <summary>
        /// Variável que retorna o valor selecionado
        /// </summary>
        public int iRetorno { get; set; }

        #endregion

        #region Declarações
        EnpresasNG _empresa;
        CursosNG _curso;
        ResponsaveisNG _resp;
        EstagiarioNG _est;
        MediadoraNG _med;
        
        private List<Empresas> lst;
        private List<Cursos> lstCur;
        private List<Responsaveis> lstResp;
        private List<Estagiaros> lstEst;
        private List<Mediadora> lstMed;

        #endregion

        #region Métodos Form

        public frmPesquisa()
        {
            InitializeComponent();
        }

        private void frmPesquisa_Load(object sender, EventArgs e)
        {
            LblTitulo.Text = titulo;
            LblTitulo.Refresh();
            bRetorno = false;
            Pesquisa();
        }

        private void BtnSair_Click(object sender, EventArgs e)
        {
            Close();
        }
        private void ListaPesquisa_DoubleClick(object sender, EventArgs e)
        {
            BtnConfirmar_Click(BtnConfirmar, e);
        }

        private void BtnConfirmar_Click(object sender, EventArgs e)
        {
            if (ListaPesquisa.FocusedItem != null)
            {
                if (ListaPesquisa.FocusedItem.Selected == true)
                {
                    iRetorno = Int32.Parse(ListaPesquisa.FocusedItem.Text);
                    ListaPesquisa.FocusedItem.Selected = false;
                    Hide();
                }
            }
        }
        #endregion

        #region Pesquisa
        /// <summary>
        /// Realiza a Listagem de acordo com o filtro
        /// </summary>
        private void Pesquisa()
        {
            switch (Tipo)
            {
                case TipoPesquisa.Empresa:
                    if (ListaEmpresa()) bRetorno = true;
                    break;
                case TipoPesquisa.Curso:
                    if (ListaCurso()) bRetorno = true;
                    break;
                case TipoPesquisa.Responsavel:
                    if (ListaResponsavel()) bRetorno = true;
                    break;
                case TipoPesquisa.Estagiario:
                    if (ListaEstagiario()) bRetorno = true;
                    break;
                case TipoPesquisa.Mediadora:
                    if (ListaMediadora()) bRetorno = true;
                    break;
                default:
                    break;
            }
        }

        #endregion

        #region Lista Empresa
        /// <summary>
        /// Lista as Empresas
        /// </summary>
        /// <returns></returns>
        private bool ListaEmpresa()
        {
            _empresa = new EnpresasNG();
            List<Empresas> lista;

            try
            {
                lista = _empresa.Buscar();
                if (lista != null)
                {
                    ListaPesquisa.Items.Clear();
                    lst = lista.OrderBy(c => c.Nome).ToList();

                    foreach (Empresas empresa in lst)
                    {
                        var item = new ListViewItem(empresa.Codigo.ToString());
                        item.SubItems.Add(empresa.Nome);

                         ListaPesquisa.Items.Add(item);
                    }
                    return true;
                }
                else
                    return false;
            }
            catch (Exception e)
            {
                throw new Exception("Ocorreu um erro ao listar a pesquisa. Erro: " + e.StackTrace);
            }

        }

        #endregion

        #region Lista Curso
        /// <summary>
        /// Lista os Cursos
        /// </summary>
        /// <returns></returns>
        private bool ListaCurso()
        {
            _curso = new CursosNG();
            List<Cursos> lista;
            try
            {
                lista = _curso.Buscar();

                if (lista != null)
                {
                    ListaPesquisa.Items.Clear();
                    lstCur = lista.OrderBy(c => c.Nome).ToList();

                    foreach (var curso in lstCur)
                    {
                        var item = new ListViewItem(curso.Codigo.ToString());
                        item.SubItems.Add(curso.Nome);

                        ListaPesquisa.Items.Add(item);
                    }
                    return true;
                }
                else
                    return false;
            }
            catch (Exception e)
            {

                throw new Exception("Ocorreu um erro ao listar a pesquisa. Erro: " + e.StackTrace);
            }
        }

        #endregion

        #region Lista Responsável
        /// <summary>
        /// Lista os Responsáveis
        /// </summary>
        /// <returns></returns>
        private bool ListaResponsavel()
        {
            _resp = new ResponsaveisNG();
            List<Responsaveis> lista;
            try
            {
                lista = _resp.Buscar();

                if (lista != null)
                {
                    ListaPesquisa.Items.Clear();

                    lstResp = lista.OrderBy(c => c.Nome).ToList();

                    foreach (var resp in lstResp)
                    {
                        var item = new ListViewItem(resp.Codigo.ToString());
                        item.SubItems.Add(resp.Nome);
                        ListaPesquisa.Items.Add(item);
                    }
                    return true;
                }
                else
                    return false;
            }
            catch (Exception e)
            {
                throw new Exception("Ocorreu um erro ao listar a pesquisa. Erro: " + e.StackTrace);
            }
        }

        #endregion

        #region Estagiario

        /// <summary>
        /// Lista os Estagiários
        /// </summary>
        /// <returns></returns>
        private bool ListaEstagiario()
        {
            _est = new EstagiarioNG();
            List<Estagiaros> lista;

            try
            {
                lista = _est.Buscar();

                if (lista != null)
                {
                    ListaPesquisa.Items.Clear();

                    lstEst = lista.OrderBy(c => c.Nome).ToList();
                    foreach (var est in lstEst)
                    {
                        var item = new ListViewItem(est.Matricula.ToString());
                        item.SubItems.Add(est.Nome);
                        ListaPesquisa.Items.Add(item);
                    }
                    return true;
                }
                else
                    return false;
            }
            catch (Exception e)
            {
                throw new Exception("Ocorreu um erro ao listar a pesquisa. Erro: " + e.StackTrace);
            }
        }

        #endregion

        #region Mediadora

        /// <summary>
        /// Lista Mediadoras
        /// </summary>
        /// <returns></returns>
        private bool ListaMediadora()
        {
            _med = new MediadoraNG();
            List<Mediadora> lista;

            try
            {
                lista = _med.Buscar();
                if (lista != null)
                {
                    ListaPesquisa.Items.Clear();

                    lstMed = lista.OrderBy(c => c.Nome).ToList();
                    
                    foreach (var med in lstMed)
                    {
                        var item = new ListViewItem(med.Codigo.ToString());
                        item.SubItems.Add(med.Nome);
                        ListaPesquisa.Items.Add(item);
                    }
                    return true;
                }
                return false;
            }
            catch (Exception e)
            {
                throw new Exception("Ocorreu um erro ao listar a pesquisa. Erro: " + e.StackTrace);
            }
        }

        #endregion

    }
}
